package ReflectStudy.Exa4;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 查看类的成员：
 * 1.属性字段信息
 * 2.方法信息
 * 3.构造方法信息
 */
public class ClassViewer {

    public static void main(String[] args) throws ClassNotFoundException {

        Class<?> clazz = Class.forName("ReflectStudy.Exa4.TestBean");

        System.out.println("类的规范名称：" + clazz.getCanonicalName());

        // 获得该类对象的所有构造方法对象
        Constructor<?>[] constructors = clazz.getConstructors();

        System.out.println("类TestBean的构造方法：");
        if (constructors.length != 0) {
            for (Constructor<?> constructor : constructors) {
                System.out.println("\t" + constructor);// 输出构造方法
            }
        } else {
            System.out.println("\t空");
        }

        // 获得该类对象的所有非继承字段对象数组
        Field[] fields = clazz.getDeclaredFields();
        System.out.println("类的非继承变量(包括私有的)：");
        if (fields.length != 0) {
            for (Field field : fields) {
                System.out.println("\t" + field);// 输出非继承域
            }
        } else {
            System.out.println("\t空");
        }

        // 获得该类对象的所有非继承方法对象数组
        Method[] methods = clazz.getDeclaredMethods();
        System.out.println("类的非继承方法(包括私有的)：");
        if (methods.length != 0) {
            for (Method method : methods) {
                System.out.println(method);// 输出非继承方法
            }
        } else {
            System.out.println("\t空");
        }

        //获得类的公共字段对象数组
        Field[] pubFields = clazz.getFields();
        System.out.println("类的所有公共字段(包括继承的):");
        for (Field field : pubFields) {
            System.out.println("\t" + field);
        }

        //获得类的公共方法对象数组
        Method[] pubMethods = clazz.getMethods();
        System.out.println("类的所有公共方法(包括继承的)：");
        for (Method method : pubMethods) {
            System.out.println(method);
        }

    }
}
